package contratosonline.ejb.controller;


import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;

import contratosonline.entity.Contrato;
import contratosonline.entity.LicitacaoOrigem;

import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author admin
 */
@Stateless
public class LicitacaoOrigemJPAController implements LicitacaoOrigemJPAControllerLocal{
	@PersistenceContext
	private EntityManager em;

    public EntityManager getEntityManager() {
        return em;
    }
	public LicitacaoOrigemJPAController(){
		
	}

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#persiste(contratosonline.entity.LicitacaoOrigem)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#persiste(contratosonline.entity.LicitacaoOrigem)
	 */
    public void persiste(LicitacaoOrigem licitacaoorigem) {
        if (licitacaoorigem.getContratoCollection() == null) {
            licitacaoorigem.setContratoCollection(new ArrayList<Contrato>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            Collection<Contrato> attachedContratoCollection = new ArrayList<Contrato>();
            for (Contrato contratoCollectionContratoToAttach : licitacaoorigem.getContratoCollection()) {
                contratoCollectionContratoToAttach = em.getReference(contratoCollectionContratoToAttach.getClass(), contratoCollectionContratoToAttach.getIdcontrato());
                attachedContratoCollection.add(contratoCollectionContratoToAttach);
            }
            licitacaoorigem.setContratoCollection(attachedContratoCollection);
            em.persist(licitacaoorigem);
            for (Contrato contratoCollectionContrato : licitacaoorigem.getContratoCollection()) {
                LicitacaoOrigem oldLicitacaoOrigemOfContratoCollectionContrato = contratoCollectionContrato.getLicitacaoOrigem();
                contratoCollectionContrato.setLicitacaoOrigem(licitacaoorigem);
                contratoCollectionContrato = em.merge(contratoCollectionContrato);
                if (oldLicitacaoOrigemOfContratoCollectionContrato != null) {
                    oldLicitacaoOrigemOfContratoCollectionContrato.getContratoCollection().remove(contratoCollectionContrato);
                    oldLicitacaoOrigemOfContratoCollectionContrato = em.merge(oldLicitacaoOrigemOfContratoCollectionContrato);
                }
            }
        } finally {
            if (em != null) {
                //em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#altera(contratosonline.entity.LicitacaoOrigem)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#altera(contratosonline.entity.LicitacaoOrigem)
	 */
    public void altera(LicitacaoOrigem licitacaoorigem) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            LicitacaoOrigem persistentLicitacaoorigem = em.find(LicitacaoOrigem.class, licitacaoorigem.getIdlicitacaoOrigem());
            Collection<Contrato> contratoCollectionOld = persistentLicitacaoorigem.getContratoCollection();
            Collection<Contrato> contratoCollectionNew = licitacaoorigem.getContratoCollection();
            Collection<Contrato> attachedContratoCollectionNew = new ArrayList<Contrato>();
            for (Contrato contratoCollectionNewContratoToAttach : contratoCollectionNew) {
                contratoCollectionNewContratoToAttach = em.getReference(contratoCollectionNewContratoToAttach.getClass(), contratoCollectionNewContratoToAttach.getIdcontrato());
                attachedContratoCollectionNew.add(contratoCollectionNewContratoToAttach);
            }
            contratoCollectionNew = attachedContratoCollectionNew;
            licitacaoorigem.setContratoCollection(contratoCollectionNew);
            licitacaoorigem = em.merge(licitacaoorigem);
            for (Contrato contratoCollectionOldContrato : contratoCollectionOld) {
                if (!contratoCollectionNew.contains(contratoCollectionOldContrato)) {
                    contratoCollectionOldContrato.setLicitacaoOrigem(null);
                    contratoCollectionOldContrato = em.merge(contratoCollectionOldContrato);
                }
            }
            for (Contrato contratoCollectionNewContrato : contratoCollectionNew) {
                if (!contratoCollectionOld.contains(contratoCollectionNewContrato)) {
                    LicitacaoOrigem oldLicitacaoOrigemOfContratoCollectionNewContrato = contratoCollectionNewContrato.getLicitacaoOrigem();
                    contratoCollectionNewContrato.setLicitacaoOrigem(licitacaoorigem);
                    contratoCollectionNewContrato = em.merge(contratoCollectionNewContrato);
                    if (oldLicitacaoOrigemOfContratoCollectionNewContrato != null && !oldLicitacaoOrigemOfContratoCollectionNewContrato.equals(licitacaoorigem)) {
                        oldLicitacaoOrigemOfContratoCollectionNewContrato.getContratoCollection().remove(contratoCollectionNewContrato);
                        oldLicitacaoOrigemOfContratoCollectionNewContrato = em.merge(oldLicitacaoOrigemOfContratoCollectionNewContrato);
                    }
                }
            }
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = licitacaoorigem.getIdlicitacaoOrigem();
                if (findLicitacaoorigem(id) == null) {
                    throw new Exception("The licitacaoorigem with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
               // em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#exclui(java.lang.Integer)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#exclui(java.lang.Integer)
	 */
    public void exclui(Integer id) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            LicitacaoOrigem licitacaoorigem;
            try {
                licitacaoorigem = em.getReference(LicitacaoOrigem.class, id);
                licitacaoorigem.getIdlicitacaoOrigem();
            } catch (EntityNotFoundException enfe) {
                throw new Exception("The licitacaoorigem with id " + id + " no longer exists.", enfe);
            }
            Collection<Contrato> contratoCollection = licitacaoorigem.getContratoCollection();
            for (Contrato contratoCollectionContrato : contratoCollection) {
                contratoCollectionContrato.setLicitacaoOrigem(null);
                contratoCollectionContrato = em.merge(contratoCollectionContrato);
            }
            em.remove(licitacaoorigem);
        } finally {
            if (em != null) {
               // em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#findLicitacaoorigemEntities()
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#findLicitacaoorigemEntities()
	 */
    public List<LicitacaoOrigem> findLicitacaoorigemEntities() {
        return findLicitacaoorigemEntities(true, -1, -1);
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#findLicitacaoorigemEntities(int, int)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#findLicitacaoorigemEntities(int, int)
	 */
    public List<LicitacaoOrigem> findLicitacaoorigemEntities(int maxResults, int firstResult) {
        return findLicitacaoorigemEntities(false, maxResults, firstResult);
    }

    @SuppressWarnings("unchecked")
	private List<LicitacaoOrigem> findLicitacaoorigemEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Licitacaoorigem as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
           // em.close();
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#findLicitacaoorigem(java.lang.Integer)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#findLicitacaoorigem(java.lang.Integer)
	 */
    public LicitacaoOrigem findLicitacaoorigem(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(LicitacaoOrigem.class, id);
        } finally {
            //em.close();
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemControllerLocal#getLicitacaoorigemCount()
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.LicitacaoOrigemJPAControllerLocal#getLicitacaoorigemCount()
	 */
    public int getLicitacaoorigemCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Licitacaoorigem as o").getSingleResult()).intValue();
        } finally {
            //em.close();
        }
    }

}

